package br.com.upis.sispat.view;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import javax.annotation.PostConstruct;
import javax.faces.model.SelectItem;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import br.com.upis.sispat.entity.Patrimonio;
import br.com.upis.sispat.entity.Setor;
import br.com.upis.sispat.entity.Usuario;
import br.com.upis.sispat.enums.Perfil;
import br.com.upis.sispat.enums.TipoPatrimonio;
import br.com.upis.sispat.exception.SeamCoreException;
import br.com.upis.sispat.exception.SeamWebException;
import br.com.upis.sispat.service.PatrimonioService;

@Component
@Scope("singleton")
public class PatrimonioView extends AbstractView implements ICommandPopup {

	private static final long serialVersionUID = -993431214631653901L;
	private static final String PATH_LISTA_PATRIMONIO = CONTEXT	+ "/patrimonio/listarPatrimonio";
	private static final String PATH_EDITA_PATRIMONIO = CONTEXT	+ "/patrimonio/editarPatrimonio";
	private static final String PATH_DETALHA_PATRIMONIO = CONTEXT + "/patrimonio/detalharPatrimonio";
	private List<Patrimonio> listaPatrimonio;
	private Patrimonio patrimonio;
	private Patrimonio patrimonioPesquisa;
	private SelectItem[] listaTipoPatrimonio;
	private PatrimonioService patrimonioService;

	@PostConstruct
	public void init() {

		setPatrimonio(new Patrimonio());
		setExibePopup(false);
		setExibeMsgNenhumRegistroEncontrado(false);
	}

	public String iniciar() {

		init();

		setPatrimonioPesquisa(new Patrimonio());
		setListaPatrimonio(new ArrayList<Patrimonio>());

		return redirecionaPatrimonioAcesso(PATH_LISTA_PATRIMONIO);
	}

	public String voltar() throws SeamWebException {

		if (!getListaPatrimonio().isEmpty()) {
			try {
				setListaPatrimonio(patrimonioService.search(getPatrimonioPesquisa()));
			} catch (SeamCoreException e) {
				throw new SeamWebException(e);
			}
		} else {
			init();
		}

		return PATH_LISTA_PATRIMONIO;
	}

	private String redirecionaPatrimonioAcesso(String path) {

		if (getListaPatrimonio().isEmpty()) {

			return path;
		}

		return pesquisar();
	}

	public String pesquisar() {

		try {
			setListaPatrimonio(patrimonioService.search(getPatrimonioPesquisa()));
		} catch (SeamCoreException e) {
			e.printStackTrace();
		}
		setExibeMsgNenhumRegistroEncontrado(getListaPatrimonio().isEmpty());
		return PATH_LISTA_PATRIMONIO;
	}
	
	public String listaPatGest() {
		switch (recuperaUsuarioLogado().getIdAcesso()) {
		case 2:
			getPatrimonioPesquisa().getSetor().setCodigo(recuperaUsuarioLogado().getSetor().getCodigo());
			break;
		case 3:
			getPatrimonioPesquisa().getSetor().setCodigo(recuperaUsuarioLogado().getSetor().getCodigo());
			break;
		default:
			break;
		}
		try {
			setListaPatrimonio(patrimonioService.search(getPatrimonioPesquisa()));
		} catch (SeamCoreException e) {
			e.printStackTrace();
		}
		setExibeMsgNenhumRegistroEncontrado(getListaPatrimonio().isEmpty());
		return PATH_LISTA_PATRIMONIO;
	}

	public String novo() {

		if (!isExibePopup()) {
			init();
		}
		
		getPatrimonio().setCodigoPatrimonio("SP"+(new Random().nextInt(9))+""+(new Random().nextInt(9))+""+(new Random().nextInt(9))+""+(new Random().nextInt(9))+""+(new Random().nextInt(9)));
		return PATH_EDITA_PATRIMONIO;
	}

	public String detalhar() {

		return PATH_DETALHA_PATRIMONIO;
	}

	public String editar() throws SeamWebException {
		try {
			if (!isExibePopup()) {
				setPatrimonio(patrimonioService.getById(patrimonio.getCodigo()));
			}
		} catch (SeamCoreException e) {
			throw new SeamWebException(e);
		}

		return PATH_EDITA_PATRIMONIO;
	}

	public String salvar() throws SeamWebException {
		getPatrimonio().getSetor().setCodigo(1L);
		try {
			patrimonioService.save(getPatrimonio());
			addMessageInfo("sucesso.salvo");
		} catch (SeamCoreException e) {

			throw new SeamWebException(e);
		}

		return redirecionaPatrimonioAcesso(PATH_LISTA_PATRIMONIO);
	}

	public String atualizar() throws SeamWebException {
		try {

			patrimonioService.update(patrimonio);

			addMessageInfo("sucesso.atualizado");

		} catch (SeamCoreException e) {

			throw new SeamWebException(e);
		}

		return redirecionaPatrimonioAcesso(PATH_LISTA_PATRIMONIO);
	}

	public List<Patrimonio> getListaPatrimonio() {
		return listaPatrimonio;
	}

	public void setListaPatrimonio(List<Patrimonio> listaPatrimonio) {
		this.listaPatrimonio = listaPatrimonio;
	}

	public Patrimonio getPatrimonio() {
		if(patrimonio==null){
			patrimonio = new Patrimonio();
		}
		return patrimonio;
	}

	public void setPatrimonio(Patrimonio patrimonio) {
		this.patrimonio = patrimonio;
	}

	public SelectItem[] getListaTipoPatrimonio() {

		listaTipoPatrimonio = new SelectItem[TipoPatrimonio.getListaTipoPatrimonio().size()];

		int i = 0;

		for (TipoPatrimonio p : TipoPatrimonio.getListaTipoPatrimonio()) {
			listaTipoPatrimonio[i++] = new SelectItem(p.getValor(), p.getDescricao());
		}

		return listaTipoPatrimonio;
	}

	public void setListaTipoPatrimonio(SelectItem[] listaTipoPatrimonio) {
		this.listaTipoPatrimonio = listaTipoPatrimonio;
	}

	@Autowired
	public void setPatrimonioService(PatrimonioService patrimonioService) {
		this.patrimonioService = patrimonioService;
	}

	public Patrimonio getPatrimonioPesquisa() {
		if(patrimonioPesquisa==null){
			patrimonioPesquisa = new Patrimonio();
		}
		return patrimonioPesquisa;
	}

	public void setPatrimonioPesquisa(Patrimonio patrimonioPesquisa) {
		this.patrimonioPesquisa = patrimonioPesquisa;
	}

	@Override
	public String excluir() throws SeamWebException {

		try {
			patrimonioService.delete(getPatrimonio());

			addMessageInfo("sucesso.excluido");

		} catch (SeamCoreException e) {
			throw new SeamWebException(e);
		}

		return PATH_LISTA_PATRIMONIO;
	}

	@Override
	public boolean possuiAcesso(Perfil perfil) {
		return !isPerfilGestor();
	}

	@Override
	public String execute() throws SeamWebException {

		String path = "";

		switch (getAcaoPopUp()) {
		case 1:
			excluir();
			path = pesquisar();
			break;

		case 2:
			path = atualizar();
			break;

		case 3:
			path = salvar();
			break;

		default:
			break;
		}

		return path;
	}

	@Override
	public boolean validaForm() throws SeamWebException {

		return false;
	}

}
